﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Bukstor.Biz;
using System.Security.Cryptography;

namespace Bukstor.UI
{
    public partial class Registro : System.Web.UI.Page
    {
        BukstorBDEntities Entidades;

        protected void Page_Load(object sender, EventArgs e)
        {
            Entidades = new BukstorBDEntities();
        }

        protected void btnRegistrar_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                string mensajeError;
                if (registrarUsuario(out mensajeError))
                {
                    lblMensaje.Text = @"Se ha registrado con éxito.
Su usuario es su dirección de correo electrónico y su contraseña la que ha indicado";
                    pnlDatosPersonales.Visible = false;
                }
                else
                {
                    lblMensaje.Text = mensajeError;
                }
            }
        }

        /// <summary>
        /// Verifica la información del usuario y procede a registrarlo en la base de datos
        /// </summary>
        /// <param name="mensaje">Mensaje para el usuario en caso de que haya habido error</param>
        /// <returns>Verdadero si el usuario fué registrado. Falso si no.</returns>
        /// <remarks>
        /// Este método es actualmente más bien simple, pero podría realizar aún más validaciones.
        /// Un buen ejemplo sería validar la fortaleza de la contraseña.
        /// Soy conciente de que en realidad debería hacerlo en la capa de negocio...
        /// </remarks>
        private bool registrarUsuario(out string mensaje)
        {
            string nombre, apellido, mail, usuario, clave;
            string calle, codigo = null, dpto, loc;
            int numero = 0, piso = 0, pcia;
            nombre = txtNombre.Text;
            apellido = txtApellido.Text;
            mail = txtMail.Text;
            usuario = mail;
            clave = txtClave.Text;
            calle = txtCalle.Text;
            if (txtNumero.Text != "" && !int.TryParse(txtNumero.Text, out numero))
            {
                mensaje = "La altura de la calle no es numérica";
                return false;
            }
            if (txtPiso.Text != "" && !int.TryParse(txtPiso.Text, out numero))
            {
                mensaje = "El piso no es un número";
                return false;
            }
            dpto = txtDepartamento.Text;
            loc = txtLocalidad.Text;
            codigo = txtCodigoPostal.Text;
            pcia = int.Parse(ddlProvincia.SelectedValue);

            bool existe = (from Cliente c in Entidades.Clientes where c.e_mail == mail && c.username == mail select c).Count() != 0;
            if (existe)
            {
                mensaje = @"Ese correo electrónico ya fué registrado en nuestra base de datos.
                Inicie sesión o solicite la contraseña si la ha olvidado.";
                return false;
            }

            Cliente C = Cliente.CreateCliente(0, usuario, clave, apellido, nombre, mail);
            Direccion D = Direccion.CreateDireccion(0, calle, numero, codigo);
            if (piso != 0) D.piso = piso;
            if (dpto != "") D.departamento = dpto;
            if (loc != "") D.localidad = loc;
            D.Provincia = Entidades.Provincias.First(i => i.id == pcia);
            C.Direcciones.Add(D);
            Entidades.AddToClientes(C);
            Entidades.SaveChanges();
            mensaje = null;
            return true;
        }
    }
}
